# -*- coding: utf-8 -*-
'''
Created on 2009-04-13

@author: argaz
'''
import xmlrpclib
#import pickle
import tkMessageBox as msgBox
from BD_InterfaceBaseDonnees import *
import sys
"""
TODO//
    Optimiser le code pour reduire la communication client-serveur
    Ajouter le code pour la suppression et la modification des champs 
    Tester la vue d'édition dans la vue principale
"""
try:
    from xTkinter import *
except:
    print >> sys.stderr, 'Le module xTkinter est  introuvable'  
    sys.exit(1)

class VueEditionTable(Frame):
    FonctionDB=[]
    def __init__(self,master,parent,**cnf):
        KeysList=cnf.keys()
        self.parent = parent
        self.master=master
        self.width=400
        self.height=200
        if ('width' in KeysList):
            self.width=cnf['width']
        if ('width' in KeysList):
            self.height=cnf['height']
        Frame.__init__(self,master,cnf)        
        self.master.update()
        self.x=self.master.winfo_width()/2-(self.width/2)
        self.y=self.master.winfo_height()/2-(self.height/2)       
        self.place(x=self.x,y=self.y)
        """
        Variable qui va servir a determiner si les données d'un
        champs ont été modifiés par l'utilisateur
        """
        self.champtampon=None
        
        """
        Inscription des méthodes dans un tableau pour
        faciliter l'accès simplement par indice
        """
        """
        VueEditionTable.FonctionDB.append(self.parent.BaseDonnees.AjouterChamps)
        VueEditionTable.FonctionDB.append(self.parent.BaseDonnees.ModifierChamps)
        VueEditionTable.FonctionDB.append(self.parent.BaseDonnees.SupprimerChamps)
        """
        self.configure(width=411,height=272)
        LTable=xLabel(self,text='Tables',height=1,width=4)
        LTable.setLocation(10,10)
        "  Liste des tables existantes "
        self.CBListeTables=xCombobox(self,width=10)
        self.CBListeTables.setLocation(52,10)
        self.CBListeTables.setListWidth(15) 
        self.CBListeTables.setListHeight(3)       
        self.CBListeTables.setText('<aucune>')
        self.TableSelectionne = None
        LChamps=xLabel(self,text='Champs de la table',height=1,width=18)
        LChamps.setLocation(210,10)
        
        " Pour recharger la liste des tables"
        RechargeTables=xButton(self,text='Recharger',height=1,width=9)
        RechargeTables.setLocation(140,10)
        RechargeTables.configure(anchor=CENTER)
        RechargeTables.setCommand(self.listTables)
        
        " Liste des champs d'une table selectionnée"
        self.CBListeChamps=xCombobox(self,width=7)
        self.CBListeChamps.setLocation(310,10)
        self.CBListeChamps.setWidth(12)
        self.CBListeChamps.setText('<aucun>')
        self.CBListeChamps.setListWidth(15)
        self.CBListeChamps.setListHeight(3)
        
        TitreChamps=xLabel(self,text='Titre du champs',height=1,width=15)
        TitreChamps.setLocation(10,69)
        xLabel3=xLabel(self,text='Type du champs',height=1,width=15)
        xLabel3.setLocation(106,69)
        xLabel4=xLabel(self,text='Taille',height=1,width=6)
        xLabel4.setLocation(196,69)
        xLabel5=xLabel(self,text='Précision',height=1,width=9)
        xLabel5.setLocation(239,69)
        xLabel6=xLabel(self,text='Pattern',height=1,width=7)
        xLabel6.setLocation(300,69)
        self.ETitreChamps=xEntry(self,width=15)
        self.ETitreChamps.setLocation(10,90)
        
        " Type du champs choisi"
        self.CBTypeChamps=xCombobox(self,width=11)
        self.CBTypeChamps.setLocation(107,90)
        self.CBTypeChamps.setText('<aucun>')
        self.CBTypeChamps.setListHeight(5)
        self.CBTypeChamps.setListWidth(15)
        self.CBTypeChamps.addItems(['texte','entier','date','caractère'])
        self.CBTypeChamps.setText('texte')
        def activeAttributs():
            if (self.CBTypeChamps.getText() in ['texte','entier']):
                self.SBTaille.setActive(True)
                if (self.CBTypeChamps.getText() == 'entier'):
                    self.SBPrecision.setActive(True)
            else:
                self.SBTaille.setActive(False)
                self.SBPrecision.setActive(False)
            pass
        self.CBTypeChamps.setValidator(activeAttributs)
        
        """
        Spinbutton pour changer la taille du champs 
        Fonction non encore implementée
        """
        self.SBTaille=xSpinbox(self,width=4)
        self.SBTaille.setLocation(197,90)
        self.SBPrecision=xSpinbox(self,width=7)
        self.SBPrecision.setLocation(239,90)
        self.CBPattern=xCombobox(self,width=10)
        self.CBPattern.setLocation(300,90)
        self.CBPattern.setText('<aucun>')
        
        """
        Cette colonne est prévue pour le pattern de la date
             exp jj/mm/aaaa
        """
        xLabel6.setVisible(False)
        self.CBPattern.setVisible(False)
        self.CBPattern.setActive(False)        

        """
        Choix de l'opération
        """
        LOperation=xLabel(self,text='Opération à effectuer')
        LOperation.setLocation(10,120)
        
        self.var=IntVar()
        """
        Ajouter le champs
        """

        self.BAjouter=xRadiobutton(self,text='Ajouter',height=1,width=5)
        self.BAjouter.setLocation(10,140)
        self.BAjouter.configure(value=1,variable=self.var)
        self.BAjouter.setActive(False)

        """
        Modifier le champs
        """
        self.BModifier=xRadiobutton(self,text='Modifier',height=1,width=7)
        self.BModifier.setLocation(68,140)
        self.BModifier.configure(value=2,variable=self.var)
        self.BModifier.setActive(False)


        """
        Supprimer le champs
        """
        self.BSupprimer=xRadiobutton(self,text='Supprimer',height=1,width=9)
        self.BSupprimer.setLocation(138,140)
        self.BSupprimer.configure(value=3,variable=self.var)
        self.BSupprimer.setActive(False)

        self.BValider=xButton(self,text='Valider',width=10)
        self.BValider.setLocation(330,140)
        self.BValider.configure(anchor=CENTER)
        self.BValider.setCommand(self.OperationSurChamps)
        self.BValider.setActive(False)
        self.master.bind('<Configure>',self.repaint,add='+')       

        " Fonction associée à l'evennement <Choix d'une table> "
     
        self.CBListeTables.setValidator(self.obtenirChamps)
  
        " fonction associée à l'evennement <déail du champs>"

        self.CBListeChamps.setValidator(self.obtenirDescriptionChamps)

    def repaint(self,evt):
        self.master.update()
        self.x=self.master.winfo_width()/2-(self.width/2)
        self.y=self.master.winfo_height()/2-(self.height/2)       
        self.place(x=self.x,y=self.y)
        pass

    def OperationSurChamps(self):
        cnom=self.ETitreChamps.getText()
        ctype=self.CBTypeChamps.getText()
        ctaille=None
        cprecision=None
        if (ctype in ['texte','entier']):
            ctaille=self.SBTaille.getValue()
            if (ctype=='entier'):
                cprecision=self.SBPrecision.getValue()

        UnChamp=xChamp(nom=cnom,
                       type=ctype.upper(),
                       taille=ctaille,
                       precision=cprecision)
        print 'Impression depuis OperationSurChamps()'
        print UnChamp.Nom,UnChamp.Type,UnChamp.Taille,UnChamp.Precision
        print self.champtampon.Nom,self.champtampon.Type,self.champtampon.Taille,self.champtampon.Precision
        if(not self.champtampon.equale(UnChamp)):
           "tuser=self.parent.user"
           tnom=self.CBListeTables.getText()
           table=xTable(nom=tnom,
                         #user=tuser,
                         user='B52equip1',
                         listechamps=[UnChamp]
                         )
           indice=self.var.get()-1
           if msgBox.askokcancel('PERP 2009 | Édition de tables', 'Attention vous êtes'+\
                                  ' sur le point de modifier\n le champs '+ cnom+ ' de la table '+\
                                  tnom+'\nVoulez-vous effectuez les modifiction?'):
               VueEditionTable.FonctionDB[indice](table)
        pass
        
    def listTables(self):
        Reponse = self.parent.BaseDonnees.ObtenirTable()
        if (Reponse[0]==1):
            self.CBListeTables.clear()
            self.CBListeTables.setListHeight(3)
            NomsTable = Reponse[1]
            for NomTable in NomsTable:
                self.CBListeTables.addItem(NomTable)
            self.CBListeTables.setSelected(0)
            self.CBListeTables.setText('<CHOISIR>')
            
            
        else:
            msgBox.showerror('PERP 2009 | Édition des tables', 'Une erreur est survenue!\n'+Reponse[1])
        pass
    
    def obtenirChamps(self):
        Reponse = self.parent.BaseDonnees.ObtenirChamp(self.CBListeTables.getText())
        if (Reponse[0]==1):
            LaTable = Reponse[1]
            self.TableSelectionne = LaTable
            self.CBListeChamps.clear()
            self.CBListeChamps.setListHeight(3)
            for UnChamp in LaTable.ListeChamps:        
                self.CBListeChamps.addItem(UnChamp.Nom)
            self.CBListeChamps.setSelected(0)
            self.CBListeChamps.setText('<CHOISIR>')

        else:
            msgBox.showerror('PERP 2009 | Édition des tables', 'Une erreur est survenue!\n'+Reponse[1])
        pass
    
    def obtenirDescriptionChamps(self):
        self.BSupprimer.setActive(True)
        self.BModifier.setActive(True) 
        self.BAjouter.setActive(True)
        self.BValider.setActive(True)
        Index = self.CBListeChamps.getIndex()
        ChampSelectionne = self.TableSelectionne.ListeChamps[Index]            
        self.ETitreChamps.setText(ChampSelectionne.Nom)
        type=ChampSelectionne.Type.lower()
        self.CBTypeChamps.setText(type)
        if (type in ['date','caractére']):
            self.SBTaille.setValue(0)
            self.SBTaille.setActive(False)
            self.champtampon=xChamp(nom=ChampSelectionne.Nom,
                                    type=ChampSelectionne.Type)                
        elif (type =='texte'):
            self.SBPrecision.setValue(0)
            self.SBPrecision.setActive(False)
            self.champtampon=xChamp(nom=ChampSelectionne.Nom,
                                type=ChampSelectionne.Type,
                                taille=ChampSelectionne.Taille)
            self.SBTaille.setActive(True)
            self.SBTaille.setValue(ChampSelectionne.Taille)                
        elif (type=='entier'):
            self.SBPrecision.setActive(True)
            self.SBPrecision.setValue(ChampSelectionne.Precision)
            self.SBTaille.setActive(True)
            self.SBTaille.setValue(ChampSelectionne.Taille)
                   
            self.champtampon=xChamp(nom=ChampSelectionne.Nom,
                                    type='eniter',
                                    taille=ChampSelectionne.Taille,
                                    precision=ChampSelectionne.Precision)
            
    def __del__(self):
        self.master.unbind('<Configure>')
        pass